﻿#pragma once
#include "xdecode_task.h"
#include "xdemux_task.h"
#include "xtools.h"

class XVideoView;

class XCODEC_API XPlayer : public XThread {
public:
  // 打开音视频 初始化播放和渲染
  bool Open(const char *url, void *winId);
  // 开启解封装、解码和处理同步的线程
  void Start() override;
  // 渲染视频和播放音频
  void Update();
  // 设置线程退出标志，并等待所有线程退出
  void Stop() override;
  //
  void SetSpeed(float s);
  // 总时长
  long long total_ms() const { return total_ms_; }
  // 当前播放位置
  long long pos_ms() const { return pos_ms_; }
  // 设置视频的播放位置，单位毫秒
  bool Seek(long long pos);
  // 
  void Pause(bool is_pause) override;

protected:
  // 回调接收音视频包
  void Do(AVPacket *pkt) override;
  // 线程入口函数，处理音视频同步
  void Main() override;

protected:
  long long total_ms_ = 0;     // 总时长
  long long pos_ms_ = 0;       // 当前播放位置
  XDemuxTask demux_;           // 解封装
  XDecodeTask audio_decode_;   // 音频解码
  XDecodeTask video_decode_;   // 视频解码
  XVideoView *view_ = nullptr; // 视频渲染
                               // 音频播放时单利类，这里不加
};
